package pe.gob.osce.sirenas.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
 
import pe.gob.osce.sirenas.dao.FiscalizacionDAOLocal;
import pe.gob.osce.sirenas.dao.convert.DocenciaConvert;
import pe.gob.osce.sirenas.dao.convert.EspecialidadAcademicaConvert;
import pe.gob.osce.sirenas.dao.convert.ExperienciaLaboralConvert;
import pe.gob.osce.sirenas.dao.convert.FiscalizaEntidadConvert;
import pe.gob.osce.sirenas.dao.convert.FiscalizacionConvert;
import pe.gob.osce.sirenas.dao.convert.FiscalizacionDetalleConvert;
import pe.gob.osce.sirenas.dao.convert.FormacionAcademicaConvert;
import pe.gob.osce.sirenas.dao.convert.TrayectoriaArbitralConvert;
import pe.gob.osce.sirenas.model.BusquedaFichaDTO;
import pe.gob.osce.sirenas.model.BusquedaFiscalizacionDTO;
import pe.gob.osce.sirenas.model.DocenciaDTO;
import pe.gob.osce.sirenas.model.EspecialidadAcademicaDTO;
import pe.gob.osce.sirenas.model.ExperienciaLaboralDTO;
import pe.gob.osce.sirenas.model.FiscalizaEntidadDTO;
import pe.gob.osce.sirenas.model.FiscalizacionDTO;
import pe.gob.osce.sirenas.model.FormacionAcademicaDTO;
import pe.gob.osce.sirenas.model.TrayectoriaArbitralDTO;
import pe.gob.osce.sirenas.model.jpa.Acreditacion;
import pe.gob.osce.sirenas.model.jpa.Docencia;
import pe.gob.osce.sirenas.model.jpa.EspecialidadAcademica;
import pe.gob.osce.sirenas.model.jpa.ExperienciaLaboral;
import pe.gob.osce.sirenas.model.jpa.FichaArbitral;
import pe.gob.osce.sirenas.model.jpa.Fiscalizacion;
import pe.gob.osce.sirenas.model.jpa.FormacionAcademica;
import pe.gob.osce.sirenas.model.jpa.Persona;
import pe.gob.osce.sirenas.model.jpa.TrayectoriaArbitral;
import pe.gob.osce.sirenas.model.jpa.fiscalizacion.FiscalizaCapacitacion;
import pe.gob.osce.sirenas.model.jpa.fiscalizacion.FiscalizaDocencia;
import pe.gob.osce.sirenas.model.jpa.fiscalizacion.FiscalizaEspecialidad;
import pe.gob.osce.sirenas.model.jpa.fiscalizacion.FiscalizaExpLaboral;
import pe.gob.osce.sirenas.model.jpa.fiscalizacion.FiscalizaFormacion;
import pe.gob.osce.sirenas.model.jpa.fiscalizacion.FiscalizaTrayecArbitral;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;


@Stateless
public class FiscalizacionDAOImpl implements FiscalizacionDAOLocal {

	@PersistenceContext(unitName="pe.gob.osce.sirenas.be.pu" )
	private	EntityManager	em;

	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);
	
	@Override 
	public List<Long> listarFichasAleatorias(BusquedaFiscalizacionDTO busquedaFicha) throws Exception{

		List<Long> listarFichasAleatorias=new ArrayList<Long>();
		try{
			StringBuilder  	jpql= new StringBuilder();
						
			jpql.append("SELECT fa.idFicha FROM FichaArbitral fa WHERE fa.estado=1 ");
			jpql.append(" AND fa.idEstadoFicha != 1" );	
			//El valor para Todas las fichas es -2 Por eso parte de la validacion es que no sea un Entero para no utilizar el filtrado
			if(busquedaFicha.getTipoFicha()!=null && !isInteger(busquedaFicha.getTipoFicha().trim(), 10)){
				jpql.append(" AND fa.tipoFicha = :tipoFicha ");
			}
			if(busquedaFicha.getFecDesde()!=null && busquedaFicha.getFecHasta()==null ){	
					jpql.append(" AND  TO_CHAR(fa.auditoria.fechaRegistro,'dd/mm/yyyy') BETWEEN :fecInicio AND CURRENT_TIMESTAMP");
			}			
			if(busquedaFicha.getFecHasta()!=null && busquedaFicha.getFecDesde()!=null){
				jpql.append(" AND  TO_DATE(fa.auditoria.fechaRegistro,'dd/mm/yyyy') BETWEEN :fecInicio AND :fecFin");
			}
			
			jpql.append(" ORDER BY dbms_random.random()");//Oracle realiza la seleccion aleatoria de Fichas
			
			Query	query= em.createQuery( jpql.toString() );
			
			if(busquedaFicha.getTipoFicha()!=null && !isInteger(busquedaFicha.getTipoFicha().trim(), 10)){
				query.setParameter("tipoFicha", busquedaFicha.getTipoFicha());
			}
			if(busquedaFicha.getFecDesde()!=null && busquedaFicha.getFecHasta()==null ){						
				query.setParameter("fecInicio"," TO_CHAR("+busquedaFicha.getFecDesde()+",'dd/mm/yyyy')");
			}
			if(busquedaFicha.getFecHasta()!=null && busquedaFicha.getFecDesde()!=null){
					query.setParameter("fecInicio"," TO_CHAR("+busquedaFicha.getFecDesde()+",'dd/mm/yyyy')");
					query.setParameter("fecFin", " TO_CHAR("+ busquedaFicha.getFecHasta()+",'dd/mm/yyyy')");
			}
			
			query.setMaxResults(busquedaFicha.getValorNumerico().intValue());//Determino la cantidad de Fichas que debo seleccionar
			listarFichasAleatorias= query.getResultList();
			

		} catch (NoResultException nre) {
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listarFichasAleatorias;
	}

	@Override 
	public List<Long> listarFichaEnFiscalizacionVigente() throws Exception{

		List<Long>	listaFichas=new ArrayList<Long>();
		try{
			StringBuilder  	jpql= new StringBuilder();

			jpql.append(" SELECT fis.idFicha FROM Fiscalizacion fis WHERE fis.idEstadoProceso IN(9,10) and fis.estado=1 ");
			
			Query	query= em.createQuery( jpql.toString() );
			query.getResultList();	
			listaFichas=(List)query.getResultList();	
			

		} catch (NoResultException nre) {
			listaFichas=new ArrayList<Long>();
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listaFichas;
	}
	
	@Override 
	public List<BusquedaFiscalizacionDTO> listarBusquedaFiscalizaciones(BusquedaFiscalizacionDTO busquedaFiscalizacionDTO) throws Exception{

		List<BusquedaFiscalizacionDTO> listaBusquedaFiscalizacion=new ArrayList<BusquedaFiscalizacionDTO>();
		try{
			StringBuilder  	jpql= new StringBuilder();

			jpql.append(" SELECT fis,far,pe FROM Fiscalizacion fis JOIN fis.fichaArbitral far JOIN far.persona pe");
			jpql.append(" WHERE fis.idFicha=far.idFicha AND far.idPersona=pe.idPersona");

			if( busquedaFiscalizacionDTO.getApPaterno()!=null && busquedaFiscalizacionDTO.getApPaterno().trim().length()>0   )				
				jpql.append(" AND TRIM(pe.apPaterno) LIKE :apPaterno ");
			if( busquedaFiscalizacionDTO.getApMaterno()!=null && busquedaFiscalizacionDTO.getApMaterno().trim().length()>0   )				
				jpql.append(" AND TRIM(pe.apMaterno) LIKE :apMaterno ");
			if( busquedaFiscalizacionDTO.getNombres()!=null && busquedaFiscalizacionDTO.getNombres().trim().length()>0 )
				jpql.append(" AND TRIM(pe.nombres) LIKE :nombres ");
			if( busquedaFiscalizacionDTO.getNumRuc()!=null && busquedaFiscalizacionDTO.getNumRuc()!=0   )
				jpql.append(" AND pe.numRuc = :numRuc");
			if( busquedaFiscalizacionDTO.getNumDocumento()!=null && busquedaFiscalizacionDTO.getNumDocumento().trim().length()>0 )
				jpql.append(" AND pe.numDocumento = :numDocumento");
			if( busquedaFiscalizacionDTO.getIdEstadoProceso()!=null && busquedaFiscalizacionDTO.getIdEstadoProceso()> 0  )
				jpql.append(" AND fis.idEstadoProceso = :idEstadoProceso");	
								
			Query	query= em.createQuery( jpql.toString() );

			if( busquedaFiscalizacionDTO.getApPaterno()!=null && busquedaFiscalizacionDTO.getApPaterno().trim().length()>0   )				
				query.setParameter("apPaterno",busquedaFiscalizacionDTO.getApPaterno() );
			if( busquedaFiscalizacionDTO.getApMaterno()!=null && busquedaFiscalizacionDTO.getApMaterno().trim().length()>0   )				
				query.setParameter("apMaterno", busquedaFiscalizacionDTO.getApMaterno());			
			if( busquedaFiscalizacionDTO.getNombres()!=null && busquedaFiscalizacionDTO.getNombres().trim().length()>0 )			
				query.setParameter("nombres", busquedaFiscalizacionDTO.getNombres());
			if( busquedaFiscalizacionDTO.getNumRuc()!=null && busquedaFiscalizacionDTO.getNumRuc()!=0   )			
				query.setParameter("numRuc", busquedaFiscalizacionDTO.getNumRuc());
			if( busquedaFiscalizacionDTO.getNumDocumento()!=null && busquedaFiscalizacionDTO.getNumDocumento().trim().length()>0 )			
				query.setParameter("numDocumento", busquedaFiscalizacionDTO.getNumDocumento());
			if( busquedaFiscalizacionDTO.getIdEstadoProceso()!=null && busquedaFiscalizacionDTO.getIdEstadoProceso()> 0  )		
				query.setParameter("idEstadoProceso", busquedaFiscalizacionDTO.getIdEstadoProceso());
			
			
			List<Object[]>	listaObjeto=(List<Object[]>)query.getResultList();	
			
			if(!listaObjeto.isEmpty()){
				for (Object[] objects : listaObjeto) {
					
					listaBusquedaFiscalizacion.add(FiscalizacionConvert.createBusquedaFiscalizacionDTO((Fiscalizacion)objects[0], (FichaArbitral)objects[1], (Persona)objects[2]));
				}
			}

		} catch (NoResultException nre) {
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listaBusquedaFiscalizacion;
	}

	@Override 
	public Long tieneFiscalizacionEnProceso(Long idFicha) throws Exception {
		Long idFiscalizacion=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT fis.idFiscalizacion FROM Fiscalizacion fis WHERE fis.idEstadoProceso IN(9,10) and fis.estado=1 AND fis.idFicha= :idFicha");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFicha", idFicha);
			
			idFiscalizacion=(Long)query.getSingleResult();			
			
		} catch (NoResultException nre) {
			idFiscalizacion=null;
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return idFiscalizacion;
	}
	
	@Override
	public Fiscalizacion insertar(Fiscalizacion fiscalizacion) throws Exception{

		try{
			em.merge(fiscalizacion);
			em.flush();
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return fiscalizacion;
	}

	@Override 
	public List<Fiscalizacion> obtieneFiscalizacion(FiscalizacionDTO fiscalizacionDTO) throws Exception {
		List<Fiscalizacion> listaFiscalizacionJPA=new ArrayList<Fiscalizacion>();
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT fis FROM Fiscalizacion fis WHERE fis.estado=1");
			
			if(fiscalizacionDTO.getIdFiscalizacion()!=null && fiscalizacionDTO.getIdFiscalizacion()!=0)
				jpql.append(" AND fis.idFiscalizacion = :idFiscalizacion ");
			if(fiscalizacionDTO.getIdFicha()!=null && fiscalizacionDTO.getIdFicha()!=0)
				jpql.append(" AND fis.idFicha = :idFicha ");			
			
			Query	query= em.createQuery( jpql.toString() );

			if(fiscalizacionDTO.getIdFiscalizacion()!=null && fiscalizacionDTO.getIdFiscalizacion()!=0)
				query.setParameter("idFiscalizacion", fiscalizacionDTO.getIdFiscalizacion());
			if(fiscalizacionDTO.getIdFicha()!=null && fiscalizacionDTO.getIdFicha()!=0)
				query.setParameter("idFicha", fiscalizacionDTO.getIdFicha());
			
			listaFiscalizacionJPA=(List)query.getResultList();	 				
			
		} catch (NoResultException nre) {
			return new ArrayList<Fiscalizacion>();
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listaFiscalizacionJPA;
	}


	

	@Override 
	public FiscalizaEntidadDTO obtieneFiscalizacionCapacitacion(Long idFicha,Long idCapacitacion) throws Exception {
		FiscalizaEntidadDTO fiscalizaEntidadDTO=new FiscalizaEntidadDTO();
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT fis FROM FiscalizaCapacitacion fis WHERE fis.idFicha = :idFicha AND  fis.idCapacitacion = :idCapacitacion AND fis.estado=1");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFicha", idFicha);
			query.setParameter("idCapacitacion", idCapacitacion);
			
			FiscalizaCapacitacion fiscalizaCapacitacion =(FiscalizaCapacitacion)query.getSingleResult();			
			fiscalizaEntidadDTO=FiscalizaEntidadConvert.createFiscalizaCapacitacionDTO(fiscalizaCapacitacion);

		} catch (NoResultException nre) {
			return fiscalizaEntidadDTO;
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return fiscalizaEntidadDTO;
	}

	/**Obtiene el Detalle de la DOcencia mas los valores de la FIscalizacion realizada*/
	@Override 
	public List<DocenciaDTO> obtieneDetalleFiscalizacionDocencia(FiscalizacionDTO fiscalizacionDTO) throws Exception {
		List<DocenciaDTO> listaDocenciaFiscalizada=new ArrayList<DocenciaDTO>();
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT fis,doc FROM FiscalizaDocencia fis JOIN fis.docencia doc WHERE fis.idDocencia=doc.idDocencia AND fis.idFicha=doc.idFicha AND fis.idFiscalizacion = :idFiscalizacion AND fis.estado=1");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFiscalizacion", fiscalizacionDTO.getIdFiscalizacion());
						
			List<Object[]>	listaObjeto=(List<Object[]>)query.getResultList();	
			
			if(!listaObjeto.isEmpty()){
				for (Object[] objects : listaObjeto) {
					listaDocenciaFiscalizada.add(DocenciaConvert.createDocenciaFiscalizadaDTO((Docencia)objects[1], (FiscalizaDocencia)objects[0]));
				}
			}

		} catch (NoResultException nre) {
			return new ArrayList<DocenciaDTO>();
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listaDocenciaFiscalizada;
	}

	/**Obtiene el Detalle de los valores de la FIscalizacion realizada en Docencia*/
	@Override 
	public FiscalizaEntidadDTO obtieneFiscalizacionDocencia(FiscalizaEntidadDTO fiscalizaEntidadDTO) throws Exception {
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT fis FROM FiscalizaDocencia fis WHERE fis.idFiscalizacion = :idFiscalizacion AND  fis.idDocencia = :idDocencia AND fis.estado=1");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFiscalizacion", fiscalizaEntidadDTO.getIdFiscalizacion());
			query.setParameter("idDocencia", fiscalizaEntidadDTO.getIdEntidad());
			
			FiscalizaDocencia fiscalizaDocencia =(FiscalizaDocencia)query.getSingleResult();				
			fiscalizaEntidadDTO=FiscalizaEntidadConvert.createFiscalizaDocenciaDTO( fiscalizaDocencia);
			fiscalizaEntidadDTO.setNomEntidad(DocenciaDTO.nomEntidad);					
			
		} catch (NoResultException nre) {
			return fiscalizaEntidadDTO;
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return fiscalizaEntidadDTO;
	}

	@Override 
	public FiscalizaDocencia insertarFiscalizaDocencia(FiscalizaDocencia fiscalizaDocencia) throws Exception{
		try{
			fiscalizaDocencia=em.merge(fiscalizaDocencia);
			em.flush();
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return fiscalizaDocencia;
	}


	/**Obtiene el Detalle de la DOcencia mas los valores de la FIscalizacion realizada*/
	@Override 
	public List<EspecialidadAcademicaDTO> obtieneDetalleFiscalizacionEspecialidad(FiscalizacionDTO fiscalizacionDTO) throws Exception {
		List<EspecialidadAcademicaDTO> listaEspecialidadFiscalizada=new ArrayList<EspecialidadAcademicaDTO>();
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT fis,esp FROM FiscalizaEspecialidad fis JOIN fis.especialidadAcademica esp WHERE fis.idEspecialidad=esp.idEspecialidad AND fis.idFicha=esp.idFicha AND fis.idFiscalizacion = :idFiscalizacion AND fis.estado=1");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFiscalizacion", fiscalizacionDTO.getIdFiscalizacion());
						
			List<Object[]>	listaObjeto=(List<Object[]>)query.getResultList();	
			
			if(!listaObjeto.isEmpty()){
				for (Object[] objects : listaObjeto) {
					listaEspecialidadFiscalizada.add(EspecialidadAcademicaConvert.createEspecialidadFiscalizadaDTO((EspecialidadAcademica)objects[1], (FiscalizaEspecialidad)objects[0]));
				}
			}

		} catch (NoResultException nre) {
			return new ArrayList<EspecialidadAcademicaDTO>();
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listaEspecialidadFiscalizada;
	}
	@Override 
	public FiscalizaEntidadDTO obtieneFiscalizaEspecialidad(FiscalizaEntidadDTO fiscalizaEntidadDTO) throws Exception {
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT fis FROM FiscalizaEspecialidad fis WHERE fis.idFiscalizacion = :idFiscalizacion  AND fis.idEspecialidad = :idEspecialidad AND fis.estado=1");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFiscalizacion", fiscalizaEntidadDTO.getIdFiscalizacion());
			query.setParameter("idEspecialidad", fiscalizaEntidadDTO.getIdEntidad());
			
			FiscalizaEspecialidad fiscalizaEspecialidad =(FiscalizaEspecialidad)query.getSingleResult();	
			fiscalizaEntidadDTO=FiscalizaEntidadConvert.createFiscalizaEspecialidadDTO( fiscalizaEspecialidad);
			fiscalizaEntidadDTO.setNomEntidad(EspecialidadAcademicaDTO.nomEntidad);			
			
		} catch (NoResultException nre) {
			return fiscalizaEntidadDTO;
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return fiscalizaEntidadDTO;
	}
	@Override
	public FiscalizaEspecialidad insertarFiscalizaEspecialidad(FiscalizaEspecialidad fiscalizaEspecialidad) throws Exception{
		try{
			fiscalizaEspecialidad=em.merge(fiscalizaEspecialidad);
			em.flush();
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return fiscalizaEspecialidad;
	}


	/**Obtiene el Detalle de la Exp Laboral mas los valores de la FIscalizacion realizada*/
	@Override 
	public List<ExperienciaLaboralDTO> obtieneDetalleFiscalizacionExpLaboral(FiscalizacionDTO fiscalizacionDTO) throws Exception {
		List<ExperienciaLaboralDTO> listaExpLaboralFiscalizada=new ArrayList<ExperienciaLaboralDTO>();
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT fis,exp FROM FiscalizaExpLaboral fis JOIN fis.experienciaLaboral exp WHERE fis.idLaboral=exp.idLaboral AND fis.idFicha=exp.idFicha AND fis.idFiscalizacion = :idFiscalizacion AND fis.estado=1");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFiscalizacion", fiscalizacionDTO.getIdFiscalizacion());
						
			List<Object[]>	listaObjeto=(List<Object[]>)query.getResultList();	
			
			if(!listaObjeto.isEmpty()){
				for (Object[] objects : listaObjeto) {
					listaExpLaboralFiscalizada.add(ExperienciaLaboralConvert.createExpLaboralFiscalizadaDTO( (ExperienciaLaboral)objects[1], (FiscalizaExpLaboral)objects[0]));
				}
			}

		} catch (NoResultException nre) {
			return new ArrayList<ExperienciaLaboralDTO>();
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listaExpLaboralFiscalizada;
	}
	@Override 
	public FiscalizaEntidadDTO obtieneFiscalizaExpLaboral(FiscalizaEntidadDTO fiscalizaEntidadDTO) throws Exception {
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT fis FROM FiscalizaExpLaboral fis WHERE fis.idFiscalizacion = :idFiscalizacion AND fis.idLaboral = :idLaboral AND fis.estado=1");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFiscalizacion", fiscalizaEntidadDTO.getIdFiscalizacion());
			query.setParameter("idLaboral", fiscalizaEntidadDTO.getIdEntidad());
			
			FiscalizaExpLaboral fiscalizaExpLaboral =(FiscalizaExpLaboral)query.getSingleResult();	
			fiscalizaEntidadDTO=FiscalizaEntidadConvert.createFiscalizaExpLaboralDTO(fiscalizaExpLaboral);
			fiscalizaEntidadDTO.setNomEntidad(ExperienciaLaboralDTO.nomEntidad);
			
		} catch (NoResultException nre) {
			return fiscalizaEntidadDTO;
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return fiscalizaEntidadDTO;
	}
	@Override
	public FiscalizaExpLaboral insertarFiscalizaExpLaboral(FiscalizaExpLaboral fiscalizaExpLaboral) throws Exception{
		try{
			fiscalizaExpLaboral=em.merge(fiscalizaExpLaboral);
			em.flush();
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return fiscalizaExpLaboral;
	}

	/**Obtiene el Detalle de la Formacion Academica mas los valores de la FIscalizacion realizada*/
	@Override 
	public List<FormacionAcademicaDTO> obtieneDetalleFiscalizacionFormacion(FiscalizacionDTO fiscalizacionDTO) throws Exception {
		List<FormacionAcademicaDTO> listaFormacionFiscalizada=new ArrayList<FormacionAcademicaDTO>();
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT fis,form FROM FiscalizaFormacion fis JOIN fis.formacionAcademica form WHERE fis.idEstudios=form.idFormacionAcademica AND fis.idFicha=form.idFicha AND fis.idFiscalizacion = :idFiscalizacion AND fis.estado=1");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFiscalizacion", fiscalizacionDTO.getIdFiscalizacion());
						
			List<Object[]>	listaObjeto=(List<Object[]>)query.getResultList();	
			
			if(!listaObjeto.isEmpty()){
				for (Object[] objects : listaObjeto) {
					listaFormacionFiscalizada.add(FormacionAcademicaConvert.createFormacionFiscalizadaDTO(  (FormacionAcademica)objects[1], (FiscalizaFormacion)objects[0]));
				}
			}

		} catch (NoResultException nre) {
			return new ArrayList<FormacionAcademicaDTO>();
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listaFormacionFiscalizada;
	}
	@Override 
	public FiscalizaEntidadDTO obtieneFiscalizaFormacion(FiscalizaEntidadDTO fiscalizaEntidadDTO) throws Exception {
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT fis FROM FiscalizaFormacion fis WHERE fis.idFiscalizacion = :idFiscalizacion AND  fis.idEstudios = :idEstudios AND fis.estado=1");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFiscalizacion", fiscalizaEntidadDTO.getIdFiscalizacion());
			query.setParameter("idEstudios", fiscalizaEntidadDTO.getIdEntidad());
			
			FiscalizaFormacion fiscalizaFormacion =(FiscalizaFormacion)query.getSingleResult();	
			
			fiscalizaEntidadDTO=FiscalizaEntidadConvert.createFiscalizaFormacionDTO(fiscalizaFormacion);
			fiscalizaEntidadDTO.setNomEntidad(FormacionAcademicaDTO.nomEntidad);
			
		} catch (NoResultException nre) {
			return fiscalizaEntidadDTO;
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return fiscalizaEntidadDTO;
	}

	@Override
	public FiscalizaFormacion insertarFiscalizaFormacion(FiscalizaFormacion fiscalizaFormacion) throws Exception{
		try{
			fiscalizaFormacion=em.merge(fiscalizaFormacion);
			em.flush();
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return fiscalizaFormacion;
	}

	/**Obtiene el Detalle de la Formacion Academica mas los valores de la FIscalizacion realizada*/
	@Override 
	public List<TrayectoriaArbitralDTO> obtieneDetalleFiscalizacionTrayectoria(FiscalizacionDTO fiscalizacionDTO) throws Exception {
		List<TrayectoriaArbitralDTO> listaTrayectoriaFiscalizada=new ArrayList<TrayectoriaArbitralDTO>();
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT fis,tray FROM FiscalizaTrayecArbitral fis JOIN fis.trayectoriaArbitral tray WHERE fis.idTrayectoria=tray.idTrayectoria AND fis.idFicha=tray.idFicha AND fis.idFiscalizacion = :idFiscalizacion AND fis.estado=1");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFiscalizacion", fiscalizacionDTO.getIdFiscalizacion());
						
			List<Object[]>	listaObjeto=(List<Object[]>)query.getResultList();	
			
			if(!listaObjeto.isEmpty()){
				for (Object[] objects : listaObjeto) {
					listaTrayectoriaFiscalizada.add(TrayectoriaArbitralConvert.createTrayectoriaFiscalizadaDTO(  (TrayectoriaArbitral)objects[1], (FiscalizaTrayecArbitral)objects[0]));
				}
			}

		} catch (NoResultException nre) {
			return new ArrayList<TrayectoriaArbitralDTO>();
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listaTrayectoriaFiscalizada;
	}
	@Override 
	public FiscalizaEntidadDTO obtieneFiscalizaTrayecArbitral(FiscalizaEntidadDTO fiscalizaEntidadDTO) throws Exception {
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT fis FROM FiscalizaTrayecArbitral fis WHERE fis.idFiscalizacion = :idFiscalizacion AND  fis.idTrayectoria = :idTrayectoria AND fis.estado=1");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFiscalizacion", fiscalizaEntidadDTO.getIdFiscalizacion());
			query.setParameter("idTrayectoria", fiscalizaEntidadDTO.getIdEntidad());
			
			FiscalizaTrayecArbitral fiscalizaTrayecArbitral =(FiscalizaTrayecArbitral)query.getSingleResult();	
			
			fiscalizaEntidadDTO=FiscalizaEntidadConvert.createFiscalizaTrayecArbitralDTO( fiscalizaTrayecArbitral);
			fiscalizaEntidadDTO.setNomEntidad(TrayectoriaArbitralDTO.entidadTabla);			

		} catch (NoResultException nre) {
			return fiscalizaEntidadDTO;
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return fiscalizaEntidadDTO;
	}
	@Override 
	public FiscalizaTrayecArbitral insertarFiscalizaTrayecArbitral(FiscalizaTrayecArbitral fiscalizaTrayecArbitral) throws Exception{
		try{
			fiscalizaTrayecArbitral=em.merge(fiscalizaTrayecArbitral);
			em.flush();
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return fiscalizaTrayecArbitral;
	}
	
	/** base=> base del Numero */
	public static boolean isInteger(String s, int base) {
	    if(s.isEmpty()) return false;
	    for(int i = 0; i < s.length(); i++) {
	        if(i == 0 && s.charAt(i) == '-') {
	            if(s.length() == 1) return false;
	            else continue;
	        }
	        if(Character.digit(s.charAt(i),base) < 0) return false;
	    }
	    return true;
	}
}
